package pers.lmd.service.impl;

import cn.dev33.satoken.secure.BCrypt;
import cn.dev33.satoken.session.SaSessionCustomUtil;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Primary;
import pers.lmd.common.constant.CacheConstants;
import pers.lmd.common.constant.ResultEnum;
import pers.lmd.domain.R;
import pers.lmd.domain.entity.User;
import pers.lmd.service.IUserService;
import pers.lmd.mapper.UserMapper;
import org.springframework.stereotype.Service;
import pers.lmd.common.utils.ResultUtil;

/**
* @author 10149
* @description 针对表【user】的数据库操作Service实现
* @createDate 2023-04-09 16:07:08
*/
@Slf4j
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
        implements IUserService {

    /**
     * 登录验证
     *
     * @param id       唯一标识
     * @param password 密码
     * @param captcha  验证码
     * @param uuid  唯一标识
     *
     * @return 结果
     */
    @Override
    public R<SaTokenInfo> login(Long id, String password, String captcha, String uuid) {
        // id 是否正确
        if (getById(id)==null) {
            return ResultUtil.error(ResultEnum.FAIL_LOGIN_USERNAME_OR_PASSWORD);
        }

        // 密码是否正确
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper
                .select(User::getPassword)
                .eq(User::getId, id);
        if (!BCrypt.checkpw(password, Convert.toStr(getOne(wrapper).getPassword()))) {
            return ResultUtil.error(ResultEnum.FAIL_LOGIN_USERNAME_OR_PASSWORD);
        }

        // 验证码是否正确
        String captchaKey = CacheConstants.CAPTCHA_CODE_KEY+uuid;
        if( !SaSessionCustomUtil.getSessionById(captchaKey).get(captchaKey).equals(captcha)){
            return ResultUtil.error(ResultEnum.FAIL_LOGIN_CAPTCHA);

        }

        // 会话登录
        StpUtil.login(id);
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        return ResultUtil.success(ResultEnum.SUCCESS,tokenInfo);
    }

    /**
     * 获取角色
     *
     * @return 角色号
     */
    @Override
    public int getRole(){
        // 获取当前会话账号id, 并转化为 long 类型
        Long id = StpUtil.getLoginIdAsLong();
        // mybatis-plus 拉姆达条件构造器
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        // 获取指定 id 的角色
        wrapper.
                select(User::getRole).
                eq(User::getId,id);
        return getOne(wrapper).getRole();
    }

    /**
     *
     * @param id 用户id
     * @return 角色
     */
    @Override
    public int getRole(Long id){
        // mybatis-plus 拉姆达条件构造器
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        // 获取指定 id 的角色
        wrapper.
                select(User::getRole).
                eq(User::getId,id);
        return getOne(wrapper).getRole();
    }
}





